/**
 * 一个闭包
 * @param {*} reducer 处理器：根据派发的action和传入的老状态state返回新状态
 */
export default function createStore(reducer) {
  let state; //可以是任意数
  let listeners = [];
  function getState() {
    // 得到新状态
    return state;
  }
  function dispatch(action) {
    state = reducer(state, action); // 根据老状态和派发的动作等到一个新状态
    listeners.forEach((l) => l()); // 当状态变化的时候一起发布，一起渲染页面
  }

  function subscribe(listener) {
    // 订阅更新事件
    listeners.push(listener);
    return () => {
      listeners.filter((l) => l !== listener); // 取消订阅
    };
  }
  return {
    getState,
    dispatch,
    subscribe,
  };
}
